/**
 * 通用数据获取工具函数
 * 为各组件提供统一的数据获取和状态管理逻辑
 */

import { ref, type Ref } from 'vue'
// 直接导入API函数
import { getDiskInfo, getDiskIOStats } from '@/api/disk'
import { getProcessIOStats } from '@/api/process'

/**
 * 数据获取状态接口
 */
export interface DataFetchingState<T> {
  data: Ref<T[]>
  loading: Ref<boolean>
  error: Ref<string | null>
}

/**
 * 创建通用数据获取钩子
 * @param fetchFunction 数据获取函数
 * @param errorMessage 错误提示消息
 * @returns 数据获取状态和控制器
 */
export const useDataFetching = <T>(
  fetchFunction: () => Promise<T[]>,
  errorMessage: string = '获取数据失败',
) => {
  const data = ref<T[]>([])
  const loading = ref<boolean>(true)
  const error = ref<string | null>(null)

  /**
   * 获取数据
   */
  const fetchData = async () => {
    try {
      loading.value = true
      error.value = null
      data.value = await fetchFunction()
    } catch (err) {
      error.value = errorMessage
      console.error(err)
    } finally {
      loading.value = false
    }
  }

  /**
   * 刷新数据（重新获取）
   */
  const refresh = async () => {
    await fetchData()
  }

  return {
    data,
    loading,
    error,
    fetchData,
    refresh,
  }
}

/**
 * 磁盘信息数据获取钩子
 */
export const useDiskInfoFetching = () => {
  return useDataFetching(getDiskInfo, '获取磁盘信息失败')
}

/**
 * 磁盘IO统计数据获取钩子
 */
export const useDiskIOStatsFetching = () => {
  return useDataFetching(getDiskIOStats, '获取磁盘IO统计信息失败')
}

/**
 * 进程IO统计数据获取钩子
 */
export const useProcessIOStatsFetching = () => {
  return useDataFetching(getProcessIOStats, '获取进程IO统计信息失败')
}
